package negocio;

import java.sql.Date;
import java.sql.Time;

public class Clase implements Comparable<Clase>
{
	private int id;
	private Cursada cursada;
	private Date fecha;
	private Time horaInicio;
	private Time horaFin;
	//public enum Estado {PENDIENTE, FINALIZADA, CANCELADA} // Alguno mas?
	private String estado;
	private Sala sala;
	
	public Clase(Cursada cursada, Date fecha, Time horaInicio, Time horaFin, String estado, Sala sala)
	{
		this.cursada = cursada;
		this.fecha = fecha;
		this.horaInicio = horaInicio;
		this.horaFin = horaFin;
		this.estado = estado;
		this.setSala(sala);
	}
	
	public Clase(int id, Cursada cursada, Date fecha, Time horaInicio, Time horaFin, String estado,Sala sala)
	{
		this.id = id;
		this.cursada = cursada;
		this.fecha = fecha;
		this.horaInicio = horaInicio;
		this.horaFin = horaFin;
		this.estado = estado;
		this.setSala(sala);
	}
	
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public Cursada getCursada() {
		return cursada;
	}
	public void setCursada(Cursada cursada) {
		this.cursada = cursada;
	}
	public Date getFecha() {
		return fecha;
	}
	public void setFecha(Date fecha) {
		this.fecha = fecha;
	}
	public Time getHoraInicio() {
		return horaInicio;
	}
	public void setHoraInicio(Time horaInicio) {
		this.horaInicio = horaInicio;
	}
	public Time getHoraFin() {
		return horaFin;
	}
	public void setHoraFin(Time horaFin) {
		this.horaFin = horaFin;
	}
	public String getEstado() {
		return estado;
	}
	public void setEstado(String estado) {
		this.estado = estado;
	}
	
	@SuppressWarnings("deprecation")
	public String toString()
	{
		String fecha = this.fecha.getYear() +"-"+ (this.fecha.getMonth()+1)+"-"+this.fecha.getDate();
		return fecha;
	}

	public Sala getSala() {
		return sala;
	}

	public void setSala(Sala sala) {
		this.sala = sala;
	}

	@Override
	public int compareTo(Clase clase) 
	{
		return this.fecha.compareTo(clase.getFecha());
	}
	
	
	
	@SuppressWarnings("deprecation")
	public boolean ocupaFranjaHoraria(Time franjaInicio, Time franjaFin)
	{
		//si la hora de inicio de la clase es posterior o igual a la hora de inicio de la franja, y la 
		//hora de inicio es anterior al fin de la franja devolver TRUE
		if(this.horaInicio.getHours()>franjaInicio.getHours()&&this.horaInicio.getHours()<franjaFin.getHours())
		{
			return true;
		}
				
		
		//o si coincide con el inicio y fin de la franja devolver TRUE
		else if(this.horaInicio.getHours()==franjaInicio.getHours()||this.horaFin.getHours()==franjaFin.getHours())
		{
			return true;
		}
		
		//o si la hora fin es menor al fin de la franja y mayor al inicio de la franja devolver TRUE
		else if(this.horaFin.getHours()<franjaFin.getHours()&&this.horaFin.getHours()>franjaInicio.getHours())
		{
			return true;
		}
		
		//o si la hora de inicio es anterior al fin de la franja y la hora fin es posterior al fin de la franja
		else if(this.horaInicio.getHours()<franjaInicio.getHours()&&this.horaFin.getHours()>franjaFin.getHours()&&franjaFin.getHours()!=0)
		{
			return true;
		}
		else
			return false;
		
		
	}
	
	public boolean seDictaEnFecha(Date fecha)
	{
		if(this.fecha.getYear()==fecha.getYear())
		{
			if(this.fecha.getMonth()==fecha.getMonth())
			{
				if(this.fecha.getDate()==fecha.getDate())
				{
					return true;
				}
			}
		}	
		return false;
	}
	
	public boolean comparteFranja(Clase otra, Time franjaInicio, Time franjaFin)
	{
		if(this.ocupaFranjaHoraria(franjaInicio, franjaFin)&&otra.ocupaFranjaHoraria(franjaInicio, franjaFin))
		{
			return true;
		}
		
		return false;
	}

	public boolean compartenHora(Clase k) {
		if(this.horaInicio.getHours()>k.getHoraInicio().getHours()&&this.horaInicio.getHours()<k.getHoraFin().getHours())
		{
			return true;
		}
				
		
		//o si coincide con el inicio y fin de la franja devolver TRUE
		else if(this.horaInicio.getHours()==k.getHoraInicio().getHours()||this.horaFin.getHours()==k.getHoraFin().getHours())
		{
			return true;
		}
		
		//o si la hora fin es menor al fin de la franja y mayor al inicio de la franja devolver TRUE
		else if(this.horaFin.getHours()<k.getHoraFin().getHours()&&this.horaFin.getHours()>k.getHoraInicio().getHours())
		{
			return true;
		}
		
		//o si la hora de inicio es anterior al fin de la franja y la hora fin es posterior al fin de la franja
		else if(this.horaInicio.getHours()<k.getHoraInicio().getHours()&&this.horaFin.getHours()>k.getHoraFin().getHours()&&k.getHoraFin().getHours()!=0)
		{
			return true;
		}
		//o si la hora de fin es igual a la hora de inicio y los minutos de fin son mayores a los minutos de inicio
		else if(this.getHoraFin().getHours()==k.getHoraInicio().getHours())
		{
			if(this.getHoraFin().getMinutes()>k.getHoraInicio().getMinutes())
				return true;
		}
		//o si la hora de inicio es igual a la hora fin y los minutos de inicio son menores a los minutos de fin
		else if(this.getHoraInicio().getHours()==k.getHoraFin().getHours())
		{
			if(this.getHoraInicio().getMinutes()<k.getHoraFin().getMinutes())
				return true;
		}
		
		return false;
	}
}
